# -*- coding: utf-8 -*-
"""
 # Copyright © 2021-2031 Dennis.gang. All rights reserved.
 # File name:   engineershovel.c
 # Author:      Dennis gang
 # Version:     V1.0.0
 # Date:        2021/11/14
 # Description: 用于解析PDF中的英文单词，翻译成中文，并输出到文件中
 # Others:
"""

import sys
import io
#import requests
import string
import time
import hashlib
import json

# 导入pdfminer所需的模块
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage, PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams, LTTextBox, LTTextLine, LTFigure, LTImage

# 修复编码问题
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

## 初始化变量
 
translate_api_url = "http://api.fanyi.baidu.com/api/trans/vip/translate"
translate_api_id = "" # 申请的百度翻译接口的id
translate_api_key = "" # 申请的百度翻译接口的password
 
pdffile = "pdfminer-docs.pdf" ##处理的pdf
doc_passwd = ''
ENtextfile = "ENmultinet.txt" # 存储提取的txt
CNtextfile = "CNmultinet.txt" # 存储翻译的结果
isTranslate = False # 是否将提取的英文翻译为中文

## 处理PDF
###使用PDFminer读取
def getDataUsingPyPDF(filename):
    # 以二进制打开一个PDF文件
    fp = open(filename, 'rb')
    # 创建与文件对象关联的PDF解析器对象
    parser = PDFParser(fp)
    # 创建存储文档结构的PDF文档对象
    # 为初始化提供密码
    document = PDFDocument(parser, doc_passwd) ##创建一个pdf文档

    # 检查文档是否允许文本提取。如果不是,中止
    if not document.is_extractable:
        raise PDFTextExtractionNotAllowed
    # 创建存储共享资源的PDF资源管理器对象
    rsrcmgr = PDFResourceManager()
    # 设置分析参数
    laparamas = LAParams()
    # 创建PDF页面聚合器对象
    device = PDFPageAggregator(rsrcmgr, laparams=laparamas)
    # 创建一个PDF解释器对象
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    contents = "" # 保存读取的text

    # 依次读取每个page的内容
    # PDFPage.get_pages(fp)，get_pages方法新版本入参为pdf文件对象fp，老版本为文档对象document
    # PDFPage.create_pages(document)，create_pages方法新版本入参为文档对象document
    for page in PDFPage.create_pages(document):
        interpreter.process_page(page)
        # 接收页面的LTPage对象
        layout = device.get_result() # 这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等 想要获取文本就获得对象的text属性，
        #在windows下，新文件的默认编码是gbk编码，所以我们在写入文件的时候需要设置一个编码格式，如下：
        for it_obj in layout:
            #if isinstance(it_obj, LTTextBox) or isinstance(it_obj, LTTextLine):
            if isinstance(it_obj, LTTextBoxHorizontal):
                results = it_obj.get_text()
                results = results.replace("\n"," ") # 去掉换行符 因为排版问题 有的换行导致句子中断
                #print(results)
                contents += (results)
            elif isinstance(it_obj, LTImage):
                # 保存 image
                print("This is a image.")
            elif isinstance(it_obj, LTFigure):
                # LTFigure对象是其他LT*对象的容器，因此递归遍历子对象
                print("This is a figure.")
    fp.close()
    ##为了看着舒服，每一句为一行
    c1 = contents.replace(". ",".\n")
    c2 = c1.replace("? ","?\n")
    c3 = c2.replace("! ","!\n")
    saveText(c3, ENtextfile)
    return contents

## 将读取的content以txt格式存放到本地
def saveText(content,Textfile):
    # with 无需自己关闭文件，释放资源
    with open(Textfile,"w",encoding='utf-8') as f:
        f.write(content)


## 翻译从pdf提取的content
def translate(content):
    salt = str(time.time())[:10]
    final_sign = str(api_id) + content + salt+ cyber
    final_sign = hashlib.md5(final_sign.encode("utf-8")).hexdigest()
    # from to 代表翻译的语言 
    paramas = {
    'q':content,
    'from':'en',
    'to':'zh',
    'appid':'%s'%api_id,
    'salt':'%s'%salt,
    'sign':'%s'%final_sign 
    }
    my_url = api_url+'?appid='+str(api_id)+'&q='+content+'&from='+'zh'+'&to='+'en'+'&salt='+salt+'&sign='+final_sign
    response = requests.get(api_url,params = paramas).content
    content = str(response,encoding = "utf-8")
    json_reads = json.loads(content)
    return json_reads['trans_result'][0]['dst']+" "
###
 
content = getDataUsingPyPDF(pdffile)
print("读取pdf成功，将其保存为txt格式")
 
if(isTranslate):
    clist = content.split(".") #split() 通过指定.将英文分成多个句子
    i = 0
    chinese = ""
    print("一共有"+str(clist.__len__())+"行需要翻译")
    print("开始翻译...请耐心等待")

    while(i<clist.__len__()):
        chinese += (translate(clist[i]).replace("\n","。"))
        #chinese += '\n'
        i+=1
        saveText(chinese,CNtextfile)
    print("翻译结束，ok")